#ifndef _TEST_APP
#define _TEST_APP

#include <time.h>
#include <stdio.h>
#include "ofSoundPlayer.h"
#include "ofMain.h"

//Necessari per la calibració
#include "TableApp.hpp"

//Necessari pel reconeixement de gestos
#include "tuioApp.h"
#include "InputGestureClasses.h"

#include "InputGestureBasic.h"
#include "InputGestureTap.h"
#include "InputGestureDoubleTap.h"
#include "InputGestureDrag.h"
#include "InputGestureRotateAndScale.h"
#include "InputGestureBasicObjects.h"

//#include "ofAddons.h"


using namespace tuio;

//La nostra classe principal Derivarà de tuioApp<TableApp>. Si no volguéssiu gestos podrieu
//derivar directament de TableApp.
//Per tal de rebre ghestos heu de definir les capacitats de tuioApp, per exemple, per a rebre
//gestos simples de cursors haurieu de aplicar la capacitat CanBasicFingers de la següent manera:
// class testApp : public CanBasicFingers <tuioApp <TableApp> >
//Si volguéssim afegir-hi una altra capacitat addicional, posem per cas CanDirectObjects, només
//ho hauriem d'encadenar:
// class testApp : public CanDirectObjects < CanBasicFingers <tuioApp <TableApp> > >
//                                     Fixeu-vos sobretot en separar els ">" -----^
//Les capacitats implementades actualment són:
//- CanBasicFingers
//- CanBasicObjects
//- CanDirectFingers
//- CanDirectObjects
//Seguiu la capçalera InputGestureClasses.h per a trobar l'especificació dels gestos corresponents
#include <map>

typedef std::vector<float> v_cut; //vector of cuts
class testApp : public CanBasicObjects <CanScale <CanDrag <CanDoubleTap <CanTap<CanBasic <tuioApp <TableApp> > > > > > >
{

private:

    int                 paquets;
    int                 shift, offset;
    int                 y0, x0, w, h;

    double              cx, cy;

    unsigned            view_size, center_zoom;

    float               scale;
    float               f1_x, f1_y, f2_x, f2_y;//positions for fiducial 1 and 2

    bool                make_circle;

    short*              stereo;
    short*              wave_L;
    short*              wave_R;
    short               max_Sound;
    double              av_sound;
    unsigned*           wave_view_data;//current data values used for visualization

    float*              fftSmoothed;

    int                 nBandsToGet;

    v_cut               cut;
    std::vector<v_cut>  vector_cuts;

    typedef struct {
       float xl;//left
       float xr;//right
       float yu;//up
       float yd;//down
    } square;

    square  path;

    float               playbackSpeed_previous, playbackSpeed_current;
    float               Pan_previous, Pan_current;
    float               Volume_previous, Volume_current;


public:

    ofSoundPlayer       clipSound;

    bool                isPlaying;

    bool                playFiducialOnTheTable;
    int32               id_1, id_6, id_12;

public:

    ~testApp();
    //aquest mètode es crida un cop a l'iniciar l'aplicació
    void Setup();
    //aquest mètode es crida abans de pintar
    void Update();
    //implementeu aquest mètode per pintar
    void Draw();
    //si heu de fer alguna cosa després de redimensionar la finestra, feu-ho aquí
    void WindowResized(int w, int h);

    //inline unpaquetnou
    void unpaquetnou(){ paquets++;}

    //void keyPressed(int key);

    //Finger gestures
    void newtap(double x, double y);
    void newDoubletap(double x, double y);
    void newDrag(double x,double y, float speedx, bool removed);
    void newScale(float sc, float x1, float x2, float y1, float y2);

    //Fiducials
    void addTuioObject(int32 id, int32 f_id ,float xpos,float ypos, float angle, float xspeed,float yspeed,float rspeed,float maccel, float raccel);
    void removeTuioObject(int32 id);
    void updateTuioObject(int32 id, int32 f_id ,float xpos,float ypos, float angle, float xspeed,float yspeed,float rspeed,float maccel, float raccel);

    int getSampleFromPixel(int x_pixel);
    void wait ( float seconds );
};

//////////////////////
//// When dragging fiducial into the table, adding finger and removing--> it crashes
//////////////////////


#endif
